using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace AppManagement.MainManagers
{
    #region using
    using DevComponents.DotNetBar;
    using AppManagement.Models;
    using AppManagement.Repositories;
    using AppManagement.Helpers;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using AppManagement.Reports;
    #endregion

    public partial class FrmQuanLyVe : Office2007Form
    {
        private ChiTietLichHoatDong ChiTietHoatDong;

        public FrmQuanLyVe(ChiTietLichHoatDong _chiTiet)
        {
            InitializeComponent();
            this.ChiTietHoatDong = _chiTiet;
        }

        private void FrmQuanLyVe_Load(object sender, EventArgs e)
        {
            InitGridView();
            LoadKhachHangs();
            LoadThongTinChuyenXe();
            LoadData();
            dtgvData.ClearSelection();
            btnCapNhat.Enabled = false;
            btnXoa.Enabled = false;
        }


        private void btnThem_Click(object sender, EventArgs e)
        {
            var errorText = string.Empty;
            if (!ValidateInput(EnumUpdateMode.INSERT, ref errorText))
            {
                MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (ActionAdd())
            {
                MessageBoxEx.Show("Lưu dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                LoadData();
                btnReset_Click(sender, e);
            }
            else
            {
                MessageBoxEx.Show("Lưu dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            var errorText = string.Empty;
            if (!ValidateInput(EnumUpdateMode.DELETE, ref errorText))
            {
                MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (MessageBoxEx.Show("Bạn có chắc chắn xóa dòng này không?", "Xóa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                if (ActionDelete())
                {
                    MessageBoxEx.Show("Xóa dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LoadData();
                    btnReset_Click(sender, e);
                }
                else
                {
                    MessageBoxEx.Show("Xóa dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void btnCapNhat_Click(object sender, EventArgs e)
        {
            var errorText = string.Empty;
            if (!ValidateInput(EnumUpdateMode.UPDATE, ref errorText))
            {
                MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (ActionUpdate())
            {
                MessageBoxEx.Show("Cập nhật dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                LoadData();
            }
            else
            {
                MessageBoxEx.Show("Cập nhật dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            txtMaVe.Text = string.Empty;
            cbxKhachHang.SelectedIndex = -1;
            txtSoGhe.Text = string.Empty;

            // Disable btnThem
            btnThem.Enabled = true;
            btnCapNhat.Enabled = false;
            btnXoa.Enabled = false;
            dtgvData.ClearSelection();

        }

        private void dtgvData_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dtgvData.SelectedRows == null || dtgvData.SelectedRows.Count == 0)
                return;

            // Disable btnThem
            btnThem.Enabled = false;
            btnCapNhat.Enabled = true;
            btnXoa.Enabled = true;

            var selectedItem = dtgvData.SelectedRows[0];
            txtMaVe.Text = dtgvData.SelectedRows[0].Cells["MaVe"].Value.ToString();
            var item = VeRepository.SelectByID(int.Parse(txtMaVe.Text));
            LoadDetailInfo(item);
        }

        public void LoadDetailInfo(Ve item)
        {
            txtSoGhe.Text = item.SoGhe == null ? string.Empty : item.SoGhe.ToString();
            cbxKhachHang.SelectedItem = item.KhachHang;
        }

        private void InitGridView()
        {
            DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "MaVe",
                DataPropertyName = "MaVe",
                Name = "MaVe",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 6))
            };
            dtgvData.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Địa điểm đi",
                DataPropertyName = "DiaDiemDi",
                Name = "DiaDiemDi",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 6))
            };
            dtgvData.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Địa điểm đến",
                DataPropertyName = "DiaDiemDen",
                Name = "DiaDiemDen",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 6))
            };
            dtgvData.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Ngày đi",
                DataPropertyName = "NgayDi",
                Name = "NgayDi",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 6))
            };
            dtgvData.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Khách hàng",
                DataPropertyName = "KhachHang",
                Name = "KhachHang",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 6))
            };
            dtgvData.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "SoGhe",
                DataPropertyName = "SoGhe",
                Name = "SoGhe",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 6)) - 1
            };
            dtgvData.Columns.Add(objColumn);
        }
        
        /// <summary>
        /// Load thong tin chuyen xe
        /// </summary>
        private void LoadThongTinChuyenXe()
        {
            txtDiaDiemDi.Text = this.ChiTietHoatDong.LichHoatDong.ChuyenXe.TuyenXe.DiaDiem.TenDiaDiem;
            txtDiaDiemDen.Text = this.ChiTietHoatDong.LichHoatDong.ChuyenXe.TuyenXe.DiaDiem1.TenDiaDiem;
            txtNgayDi.Text = String.Format("{0:dd/MM/yyyy}", this.ChiTietHoatDong.NgayHoatDong.Value);
            txtTongSoGhe.Text = this.ChiTietHoatDong.LichHoatDong.ChuyenXe.Xe.SoGhe.Value.ToString();
        }

        /// <summary>
        /// Load danh sach ve da dat
        /// </summary>
        private void LoadData()
        {
            var lstItem = VeRepository.SelectByMaChiTietLichHoatDong(this.ChiTietHoatDong.MaChiTietLichHoatDong);

            var dt = new DataTable();
            dt.Columns.Add("MaVe");
            dt.Columns.Add("DiaDiemDi");
            dt.Columns.Add("DiaDiemDen");
            dt.Columns.Add("NgayDi");
            dt.Columns.Add("KhachHang");
            dt.Columns.Add("SoGhe");

            for (int i = 0; i < lstItem.Count; i++)
            {
                dt.Rows.Add(
                    lstItem[i].MaVe, 
                    lstItem[i].ChiTietLichHoatDong.LichHoatDong.ChuyenXe.TuyenXe.DiaDiem.TenDiaDiem,
                    lstItem[i].ChiTietLichHoatDong.LichHoatDong.ChuyenXe.TuyenXe.DiaDiem1.TenDiaDiem,
                    String.Format("{0:dd/MM/yyyy}", lstItem[i].ChiTietLichHoatDong.NgayHoatDong.Value), 
                    lstItem[i].KhachHang.HoTen,
                    lstItem[i].SoGhe);
            }

            DataView objTimeSheetDV = new System.Data.DataView(dt);
            objTimeSheetDV.AllowNew = false;
            dtgvData.AutoGenerateColumns = false;
            dtgvData.DataSource = objTimeSheetDV;
            dtgvData.ClearSelection();
        }

        private bool ValidateInput(EnumUpdateMode mode, ref string errorText)
        {
            if (mode == EnumUpdateMode.UPDATE || mode == EnumUpdateMode.DELETE)
            {
                if (txtMaVe.Text == string.Empty)
                {
                    errorText = "Vui lòng chọn mã vé";
                    return false;
                }
            }
            if (mode != EnumUpdateMode.DELETE)
            {
                if (cbxKhachHang.SelectedIndex == -1)
                {
                    errorText = "Vui lòng nhập khách hàng";
                    return false;
                }
                if (txtSoGhe.Text.Equals(string.Empty))
                {
                    errorText = "Vui lòng nhập số ghế";
                    return false;
                }
                if (int.Parse(txtSoGhe.Text) <= 0)
                {
                    errorText = "Số ghế không hợp lệ";
                    return false;
                }
                // So ghe da co nguoi dat
                var ves = VeRepository.SelectByMaChiTietLichHoatDong(this.ChiTietHoatDong.MaChiTietLichHoatDong);
                var soGhe = int.Parse(txtSoGhe.Text);
                if (ves.FirstOrDefault(n => n.SoGhe == soGhe) != null)
                {
                    errorText = "Ghế đã được đặt, vui lòng nhập ghế khác";
                    return false;
                }
            }
            return true;
        }

        private bool ActionAdd()
        {
            try
            {
                var item = new Ve
                {
                    MaKhachHang = ((KhachHang)cbxKhachHang.SelectedItem).MaKhachHang,
                    MaChiTietLichHoatDong = this.ChiTietHoatDong.MaChiTietLichHoatDong,
                    SoGhe = int.Parse(txtSoGhe.Text),
                };
                if (!VeRepository.Insert(item))
                {
                    return false;
                }
                return true;
            }
            catch
            {
                return false;
            }
        }

        private bool ActionUpdate()
        {
            try
            {
                var item = VeRepository.SelectByID(int.Parse(txtMaVe.Text));
                item.MaKhachHang = ((KhachHang)cbxKhachHang.SelectedItem).MaKhachHang;
                item.MaChiTietLichHoatDong = this.ChiTietHoatDong.MaChiTietLichHoatDong;
                item.SoGhe = int.Parse(txtSoGhe.Text);
                return VeRepository.Save();
            }
            catch
            {
                return false;
            }
        }

        private bool ActionDelete()
        {
            try
            {
                return VeRepository.Delete(int.Parse(txtMaVe.Text));
            }
            catch
            {
                return false;
            }
        }


        private void btnChonKhachHang_Click(object sender, EventArgs e)
        {
            FrmQuanLyKhachHang frm = new FrmQuanLyKhachHang();
            frm.ShowDialog();
            LoadKhachHangs();
        }

        /// <summary>
        /// Load danh sach khach hang
        /// </summary>
        private void LoadKhachHangs()
        {
            var lst = KhachHangRepository.SelectAll();
            cbxKhachHang.Items.Clear();
            foreach (KhachHang kh in lst)
            {
                cbxKhachHang.Items.Add(kh);
            }
        }

        private void txtSoGhe_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsNumber(e.KeyChar) && (Keys)e.KeyChar != Keys.Back)
            {
                e.Handled = true;
            }
        }

        private void btnInVe_Click(object sender, EventArgs e)
        {
            if (dtgvData.SelectedRows == null || dtgvData.SelectedRows.Count == 0)
				return;

            FrmPrintVeXe frm = new FrmPrintVeXe(VeRepository.SelectByID(int.Parse(dtgvData.SelectedRows[0].Cells["MaVe"].Value.ToString())));
            frm.ShowDialog();
        }

        private void btnChonCho_Click(object sender, EventArgs e)
        {
            FrmChonChoNgoi frm = new FrmChonChoNgoi();
            frm.ChiTiet = ChiTietHoatDong;
            frm.Handler += ChonChoNgoi;
            frm.ShowDialog();
        }

        private void ChonChoNgoi(object sender, EventArgs e)
        {
            txtSoGhe.Text = ((TransferSimpleDataEvent)e).Data;
        }
    }
}
